/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package converter;

import java.math.BigDecimal;
import java.net.URI;
import jpa.entities.Produto;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlTransient;
import javax.xml.bind.annotation.XmlAttribute;
import javax.ws.rs.core.UriBuilder;
import javax.persistence.EntityManager;
import jpa.entities.ItemPedido;
import jpa.entities.Modelo;
import jpa.entities.Cor;
import java.util.Collection;
import jpa.entities.Tamanho;
import jpa.entities.Colecao;

/**
 *
 * @author carlos
 */

@XmlRootElement(name = "produto")
public class ProdutoConverter {
    private Produto entity;
    private URI uri;
    private int expandLevel;
    private String pathImagem;

    public String getPathImagem() {
        return pathImagem;
    }

    public void setPathImagem(String pathImagem) {
        this.pathImagem = pathImagem;
    }
  
    /** Creates a new instance of ProdutoConverter */
    public ProdutoConverter() {
        entity = new Produto();
    }

    /**
     * Creates a new instance of ProdutoConverter.
     *
     * @param entity associated entity
     * @param uri associated uri
     * @param expandLevel indicates the number of levels the entity graph should be expanded@param isUriExtendable indicates whether the uri can be extended
     */
    public ProdutoConverter(Produto entity, URI uri, String caminhoImagem, int expandLevel, boolean isUriExtendable) {
        this.entity = entity;
        this.uri = (isUriExtendable) ? UriBuilder.fromUri(uri).path(entity.getIdProduto() + "/").build() : uri;
        this.expandLevel = expandLevel;
        this.pathImagem = caminhoImagem;
        getTamanho();
        getModelo();
        getCor();
        getColecao();
        getItemPedidoCollection();
    }
    /**
     * Creates a new instance of ProdutoConverter.
     *
     * @param entity associated entity
     * @param uri associated uri
     * @param expandLevel indicates the number of levels the entity graph should be expanded@param isUriExtendable indicates whether the uri can be extended
     */
    public ProdutoConverter(Produto entity, URI uri, int expandLevel, boolean isUriExtendable) {
        this.entity = entity;
        this.uri = (isUriExtendable) ? UriBuilder.fromUri(uri).path(entity.getIdProduto() + "/").build() : uri;
        this.expandLevel = expandLevel;

        getTamanho();
        getModelo();
        getCor();
        getColecao();
        getItemPedidoCollection();
    }

    /**
     * Creates a new instance of ProdutoConverter.
     *
     * @param entity associated entity
     * @param uri associated uri
     * @param expandLevel indicates the number of levels the entity graph should be expanded
     */
    public ProdutoConverter(Produto entity, URI uri, int expandLevel) {
        this(entity, uri, expandLevel, false);
    }
    public ProdutoConverter(Produto entity, URI uri,String caminhoImagem, int expandLevel) {
        this(entity, uri,caminhoImagem, expandLevel, false);
    }

    /**
     * Getter for idProduto.
     *
     * @return value for idProduto
     */
    @XmlElement
    public Integer getIdProduto() {
        return (expandLevel > 0) ? entity.getIdProduto() : null;
    }

    /**
     * Setter for idProduto.
     *
     * @param value the value to set
     */
    public void setIdProduto(Integer value) {
        entity.setIdProduto(value);
    }

    /**
     * Getter for valorUnitario.
     *
     * @return value for valorUnitario
     */
    @XmlElement
    public BigDecimal getValorUnitario() {
        return (expandLevel > 0) ? entity.getValorUnitario() : null;
    }

    /**
     * Setter for valorUnitario.
     *
     * @param value the value to set
     */
    public void setValorUnitario(BigDecimal value) {
        entity.setValorUnitario(value);
    }

    /**
     * Getter for quantidade.
     *
     * @return value for quantidade
     */
    @XmlElement
    public Integer getQuantidade() {
        return (expandLevel > 0) ? entity.getQuantidade() : null;
    }

    /**
     * Setter for quantidade.
     *
     * @param value the value to set
     */
    public void setQuantidade(Integer value) {
        entity.setQuantidade(value);
    }

    /**
     * Getter for descricao.
     *
     * @return value for descricao
     */
    @XmlElement
    public String getDescricao() {
        return (expandLevel > 0) ? entity.getDescricao() : null;
    }

    /**
     * Setter for descricao.
     *
     * @param value the value to set
     */
    public void setDescricao(String value) {
        entity.setDescricao(value);
    }

    /**
     * Getter for maisComprado.
     *
     * @return value for maisComprado
     */
    @XmlElement
    public Long getMaisComprado() {
        return (expandLevel > 0) ? entity.getMaisComprado() : null;
    }

    /**
     * Setter for maisComprado.
     *
     * @param value the value to set
     */
    public void setMaisComprado(Long value) {
        entity.setMaisComprado(value);
    }

    /**
     * Getter for caminhoImagem.
     *
     * @return value for caminhoImagem
     */
    @XmlElement
    public String getCaminhoImagem() {
        return (expandLevel > 0) ? entity.getCaminhoImagem() : null;
    }

    /**
     * Setter for caminhoImagem.
     *
     * @param value the value to set
     */
    public void setCaminhoImagem(String value) {
        entity.setCaminhoImagem(value);
    }

    /**
     * Getter for dataRequisicao.
     *
     * @return value for dataRequisicao
     */
    @XmlElement
    public String getDataRequisicao() {
        return (expandLevel > 0) ? entity.getDataRequisicao() : null;
    }

    /**
     * Setter for dataRequisicao.
     *
     * @param value the value to set
     */
    public void setDataRequisicao(String value) {
        entity.setDataRequisicao(value);
    }

    /**
     * Getter for tamanho.
     *
     * @return value for tamanho
     */
    @XmlElement
    public TamanhoConverter getTamanho() {
        if (expandLevel > 0) {
            if (entity.getTamanho() != null) {
                return new TamanhoConverter(entity.getTamanho(), uri.resolve("tamanho/"), expandLevel - 1, false);
            }
        }
        return null;
    }

    /**
     * Setter for tamanho.
     *
     * @param value the value to set
     */
    public void setTamanho(TamanhoConverter value) {
        entity.setTamanho((value != null) ? value.getEntity() : null);
    }

    /**
     * Getter for modelo.
     *
     * @return value for modelo
     */
    @XmlElement
    public ModeloConverter getModelo() {
        if (expandLevel > 0) {
            if (entity.getModelo() != null) {
                return new ModeloConverter(entity.getModelo(), uri.resolve("modelo/"), expandLevel - 1, false);
            }
        }
        return null;
    }

    /**
     * Setter for modelo.
     *
     * @param value the value to set
     */
    public void setModelo(ModeloConverter value) {
        entity.setModelo((value != null) ? value.getEntity() : null);
    }

    /**
     * Getter for cor.
     *
     * @return value for cor
     */
    @XmlElement
    public CorConverter getCor() {
        if (expandLevel > 0) {
            if (entity.getCor() != null) {
                return new CorConverter(entity.getCor(), uri.resolve("cor/"), expandLevel - 1, false);
            }
        }
        return null;
    }

    /**
     * Setter for cor.
     *
     * @param value the value to set
     */
    public void setCor(CorConverter value) {
        entity.setCor((value != null) ? value.getEntity() : null);
    }

    /**
     * Getter for colecao.
     *
     * @return value for colecao
     */
    @XmlElement
    public ColecaoConverter getColecao() {
        if (expandLevel > 0) {
            if (entity.getColecao() != null) {
                return new ColecaoConverter(entity.getColecao(), uri.resolve("colecao/"), expandLevel - 1, false);
            }
        }
        return null;
    }

    /**
     * Setter for colecao.
     *
     * @param value the value to set
     */
    public void setColecao(ColecaoConverter value) {
        entity.setColecao((value != null) ? value.getEntity() : null);
    }

    /**
     * Getter for itemPedidoCollection.
     *
     * @return value for itemPedidoCollection
     */
    @XmlElement
    public ItemPedidoesConverter getItemPedidoCollection() {
        if (expandLevel > 0) {
            if (entity.getItemPedidoCollection() != null) {
                return new ItemPedidoesConverter(entity.getItemPedidoCollection(), uri.resolve("itemPedidoCollection/"), expandLevel - 1);
            }
        }
        return null;
    }

    /**
     * Setter for itemPedidoCollection.
     *
     * @param value the value to set
     */
    public void setItemPedidoCollection(ItemPedidoesConverter value) {
        entity.setItemPedidoCollection((value != null) ? value.getEntities() : null);
    }

    /**
     * Getter for informacaoAdicional.
     *
     * @return value for informacaoAdicional
     */
    @XmlElement
    public String getInformacaoAdicional() {
        return (expandLevel > 0) ? entity.getInformacaoAdicional() : null;
    }

    /**
     * Setter for informacaoAdicional.
     *
     * @param value the value to set
     */
    public void setInformacaoAdicional(String value) {
        entity.setInformacaoAdicional(value);
    }

    /**
     * Returns the URI associated with this converter.
     *
     * @return the uri
     */
    //@XmlAttribute
    public URI getUri() {
        return uri;
    }

    /**
     * Sets the URI for this reference converter.
     *
     */
    public void setUri(URI uri) {
        this.uri = uri;
    }

    /**
     * Returns the Produto entity.
     *
     * @return an entity
     */
    @XmlTransient
    public Produto getEntity() {
        if (entity.getIdProduto() == null) {
            ProdutoConverter converter = UriResolver.getInstance().resolve(ProdutoConverter.class, uri);
            if (converter != null) {
                entity = converter.getEntity();
            }
        }
        return entity;
    }

    /**
     * Returns the resolved Produto entity.
     *
     * @return an resolved entity
     */
    public Produto resolveEntity(EntityManager em) {
        Tamanho tamanho = entity.getTamanho();
        if (tamanho != null) {
            entity.setTamanho(em.getReference(Tamanho.class, tamanho.getIdTamanho()));
        }
        Modelo modelo = entity.getModelo();
        if (modelo != null) {
            entity.setModelo(em.getReference(Modelo.class, modelo.getIdModelo()));
        }
        Cor cor = entity.getCor();
        if (cor != null) {
            entity.setCor(em.getReference(Cor.class, cor.getIdCor()));
        }
        Colecao colecao = entity.getColecao();
        if (colecao != null) {
            entity.setColecao(em.getReference(Colecao.class, colecao.getIdColecao()));
        }
        Collection<ItemPedido> itemPedidoCollection = entity.getItemPedidoCollection();
        Collection<ItemPedido> newitemPedidoCollection = new java.util.ArrayList<ItemPedido>();
        if (itemPedidoCollection != null) {
            for (ItemPedido item : itemPedidoCollection) {
                newitemPedidoCollection.add(em.getReference(ItemPedido.class, item.getItemPedidoPK()));
            }
        }
        entity.setItemPedidoCollection(newitemPedidoCollection);
        return entity;
    }
}
